/**
 *  01 应用程序全局依赖
 * 在应用程序根组件 AppComponent 中注册那些被应用程序全局使用的依赖提供商。
 * 在下面的例子中，通过 @Component 元数据的 providers 数组导入和注册了几个服务 
 * (LoggerService, UserContext 和 UserService) 。
 */

import { Component } from '@angular/core';

import { LoggerService }      from './logger.service';
import { UserContextService } from './user-context.service';
import { UserService }        from './user.service';

/**
 * 所有这些服务都是用类实现的。服务类能充当自己的提供商，
 * 这就是为什么只要把它们列在 providers 数组里就算注册成功了。
 */

@Component({
  selector: 'my-app',
  templateUrl: 'app/app.component.html',
  providers: [ // 要把它们列在 providers 数组里就算注册成功了
    // 这样 Angular 就能在应用程序的 任何地方 ，把它们注入到 任何 组件和服务的构造函数里
    LoggerService,
    UserContextService,
    UserService
  ]
})
export class AppComponent {

  private userId: number = 1;

  // 我们在 AppComponent 里注入的 LoggerService 和 UserContext 。
  constructor(logger: LoggerService, public userContext: UserContextService) {
    userContext.loadUser(this.userId);
    logger.logInfo('AppComponent initialized');
  }
  /**
   * 当 Angular 新建 AppComponent 时，依赖注入框架先创建一个 LoggerService 的实例，
   * 然后创建 UserContextService 实例。 UserContextService 需要框架已经创建好的 LoggerService 
   * 实例和尚未创建的 UserService 实例。 UserService 没有其它依赖，
   * 所以依赖注入框架可以直接 new 一个实例。
   * 
   * 依赖注入最帅的地方在于， AppComponent 的作者不需要在乎这一切。
   * 作者只是在 (LoggerService 和 UserContextService 的 ) 
   * 构造函数里面简单的声明一下，框架就完成了剩下的工作。
   */
}

